package main

import (
	"container/list"
	"fmt"
)

/*
  迭代器模式
  可以把对象的访问方式给封装出来，只需要给某种数据结构实现自己的迭代器，
  用户只需要拿到迭代器就可以轻易操作该数据结构，而不需要在乎底层实现。
*/

type Container interface {
	Iterator() Iterator
}

type Iterator interface {
	HasNext() bool
	Value() interface{}
	Next()
}

//自己定义的数据结构
type List struct {
	list list.List
}
//返回迭代器
func (l *List) Iterator() Iterator {
  return &ListIterator{l.list.Front(),l.list.Back()}
}
//添加元素
func (l *List) Add(v interface{})  {
    l.list.PushBack(v)
}

type ListIterator struct {
	cur *list.Element
	end *list.Element
}

func (l *ListIterator) HasNext() bool {
	 if l.cur == nil{
		return false
	 }
	 return true
}

func (l *ListIterator) Next()  {
	l.cur = l.cur.Next()
}

func (l *ListIterator) Value() interface{} {
  return l.cur.Value
}

func main() {

	list := List{}
	list.Add(1)
	list.Add(2)
	list.Add(3)
	list.Add(4)
	i := list.Iterator()
	for i.HasNext() {
	   v := i.Value()
	   fmt.Println(v)
	   i.Next()
	}
}
